<?php
/**
 * Author   : 葫芦瓢子 <gourdladle@163.com>
 * Date     : 2023-06-29
 * Wechat   : skymouses
 * License  : MIT
 */

namespace GourdLadle\PhinxTp;

use Phinx\Console\PhinxApplication;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;

class Phinx extends Command
{
    /**
     * 获取Phinx命令的输入和输出对象
     * 
     * @param array $inputArg 输入参数
     * @return array ['input'=>输入对象, 'output'=>输出对象]
     */
    protected function getPhinxIO($inputArg)
    {
        $inputArg = array_merge($inputArg, ['--configuration'=>'config'.DIRECTORY_SEPARATOR.'phinx.php']);

        $input = new ArrayInput($inputArg);
        $output = new ConsoleOutput();
        return ['input'=>$input, 'output'=>$output];
    }

    /**
     * 执行Phinx命令
     * 
     * @param string $commandName 命令名
     * @param array $inputArg 输入参数
     */
    protected function runPhinx($commandName, array $inputArg)
    {
        $phinx = new PhinxApplication();
        $command = $phinx->find($commandName);

        $IO = $this->getPhinxIO($inputArg);
        $command->run($IO['input'], $IO['output']);
    }

    /**
     * 添加环境选项
     */
    protected function addEnvironmentOption()
    {
        $this->addOption('environment', '-e', Option::VALUE_REQUIRED, '指定环境数据库');
        return $this;
    }

    /**
     * Phinx环境选项
     */
    protected function phinxEnvironmentOption(&$phinxArg, Input $input)
    {
        $input->hasOption('environment')
            && $phinxArg['--environment'] = $input->getOption('environment');
    }


    /**
     * 添加选项
     */
    protected function addTargetOption()
    {
        $this->addOption('target', '-t', Option::VALUE_REQUIRED, '指定版本号');
        return $this;
    }

    /**
     * Phinx环境选项
     */
    protected function phinxTargetOption(&$phinxArg, Input $input)
    {
        $input->hasOption('target')
            && $phinxArg['--target'] = $input->getOption('target');
    }


}